﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Tecnopez.Globals;
using BussinessLogicTecnoPez.Seguridad_Tecnopez;
using System.Collections.Generic;
using BussinessLogicTecnoPez;
using Microsoft.Practices.EnterpriseLibrary.Validation;

namespace TecnoPezWeb.Modules.Seguridad
{
    public partial class ABMRoles : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.Page.IsPostBack)
                SetMode(PageMode.ListMode);

            InicializarValidadores();
            InicializarGrilla();

            cmdEliminar.OnClientClick = "return confirm('Esta seguro de eliminar el registro?');";

            GenericMasterPage master = (GenericMasterPage)this.Master;
            master.Imagen = "../Styles/Icons/configurar.gif";
            master.Titulo = "Gestión de Roles";
            cargarGrilla();
            _lblError.Text = "";
        }

        #region "Modos"
        private void SetMode(PageMode mode)
        {
            ViewState["PageMode"] = mode;
            switch (mode)
            {
                case PageMode.ListMode:
                    wzrABM.ActiveStepIndex = 0;
                    break;
                case PageMode.NewMode:
                    wzrABM.ActiveStepIndex = 1;
                    txtID.ReadOnly = true;
                    txtNombre.ReadOnly = false;
                    txtDescripcion.ReadOnly = false;
                    trvAllFunctions.Enabled = true;
                    cmdAceptar.Visible = true;
                    cmdCancelar.Enabled = true;
                    cmdEditar.Enabled = false;
                    cmdEliminar.Enabled = false;
                    break;
                case PageMode.EditMode:
                    wzrABM.ActiveStepIndex = 1;
                    txtID.ReadOnly = true;
                    txtNombre.ReadOnly = false;
                    txtDescripcion.ReadOnly = false;
                    trvAllFunctions.Enabled = true;
                    cmdAceptar.Visible = true;
                    cmdCancelar.Enabled = true;
                    cmdEditar.Enabled = false;
                    cmdEliminar.Enabled = false;
                    break;
                case PageMode.ViewMode:
                    wzrABM.ActiveStepIndex = 1;
                    txtID.ReadOnly = true;
                    txtNombre.ReadOnly = true;
                    txtDescripcion.ReadOnly = true;
                    trvAllFunctions.Enabled = false;
                    cmdAceptar.Visible = false;
                    cmdCancelar.Enabled = true;
                    cmdEditar.Enabled = true;
                    cmdEliminar.Enabled = true;
                    break;
            }
        }
        #endregion

        private void InicializarValidadores()
        {
            PPVNombre.SourceTypeName = "BussinessLogicTecnoPez.Seguridad_Tecnopez.Rol";
            PPVNombre.ControlToValidate = "txtNombre";
            PPVNombre.PropertyName = "Nombre";
            PPVNombre.DisplayMode = ValidationSummaryDisplayMode.List;

            PPVDescripcion.SourceTypeName = "BussinessLogicTecnoPez.Seguridad_Tecnopez.Rol";
            PPVDescripcion.ControlToValidate = "txtDescripcion";
            PPVDescripcion.PropertyName = "Descripcion";
            PPVDescripcion.DisplayMode = ValidationSummaryDisplayMode.List;
        }

        private void InicializarGrilla()
        {
            grdRoles.setupGrid<Rol>(cargarGrilla, seleccionarRol, null, true, this.ViewState);
        }

        private void cargarGrilla()
        {
            Rol.getManager.ClearFilters();
            Rol.getManager.ClearOrders();

            Rol.getManager.AddFilter("Nombre", GenericManager<Rol>.filterOperator.Like, "%" + this.txtBuscarNombre.Text + "%");
            Rol.getManager.AddFilter("Descripcion", GenericManager<Rol>.filterOperator.Like, "%" + this.txtBuscarDescripcion.Text + "%");

            List<Rol> lista = new List<Rol>();
            lista = Rol.getManager.GetFilter();
            grdRoles.grdDatosAbmView.DataSource = lista;
            grdRoles.grdDatosAbmView.DataBind();

        }

        private void seleccionarRol(int o)
        {
            int IdRol = int.Parse(grdRoles.grdDatosAbmView.DataKeys[o].Value.ToString());
            Rol.getManager.ClearFilters();
            Rol.getManager.AddFilter("IDROL", GenericManager<Rol>.filterOperator.Equals, IdRol);
            Rol objRol = Rol.getManager.GetOne();
            txtID.Text = objRol.IdRol.ToString();
            txtNombre.Text = objRol.Nombre.Trim();
            txtDescripcion.Text = objRol.Descripcion.Trim();

            FuncionTecnopez.getManager.ClearFilters();
            FuncionTecnopez.getManager.ClearOrders();
            FuncionTecnopez.getManager.AddOrder("Nombre", GenericManager<FuncionTecnopez>.Order.orderDirection.ASC);
            fillTreeViewer(FuncionTecnopez.getManager.GetFilter());
            selectFunctionsInTreeView(objRol.Permisos.ItemList);
            SetMode(PageMode.ViewMode);
        }

        private void selectFunctionsInTreeView(ArrayList objArray)
        {
            bool wasChecked;
            foreach (FuncionRol objItem in objArray)
            {
                wasChecked = false;
                foreach (TreeNode objNode in trvAllFunctions.Nodes)
                {
                    if (int.Parse(objNode.Value) == objItem.FuncionTecnopez.IdFuncionTecnopez)
                    {
                        objNode.Checked = true;
                        break;
                    }
                    else
                    {
                        wasChecked = findInChildNodes(objNode, objItem.FuncionTecnopez.IdFuncionTecnopez);
                        if (wasChecked)
                            break;
                    }
                }
            }
        }

        private bool findInChildNodes(TreeNode objNode, int idFuncion)
        {
            bool wasChecked;
            foreach (TreeNode objChildNode in objNode.ChildNodes)
            {
                wasChecked = false;
                if (int.Parse(objChildNode.Value) == idFuncion)
                {
                    objChildNode.Checked = true;
                    return true;
                }
                else
                {
                    wasChecked = findInChildNodes(objChildNode, idFuncion);
                    if (wasChecked)
                        return true;
                }
            }
            return false;
        }

        protected void cmdEditar_Click(object sender, EventArgs e)
        {
            SetMode(PageMode.EditMode);
        }
        protected void cmdEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                Rol objRol = new Rol();
                objRol.IdRol = int.Parse(this.txtID.Text.Trim());

                if (Rol.getManager.Delete(objRol) > 0)
                {
                    SetMode(PageMode.ListMode);
                    cargarGrilla();
                }
                else
                {
                    throw Rol.getManager.GeneratedException;
                }
            }
            catch (Exception ex)
            {
                _lblError.Text = ex.Message;
            }
        }
        protected void cmdAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                Rol objRol = new Rol();
                objRol.Nombre = txtNombre.Text.Trim();
                objRol.Descripcion = txtDescripcion.Text.Trim();
                objRol.Permisos = getPermisos();

                if (objRol.Permisos.ItemList.Count == 0)
                {
                    _lblError.Text = "No ha asignado funciones permitidas.";
                    return;
                }

                if (validar(objRol))
                {
                    if (getMode() == PageMode.NewMode)
                    {
                        if (Rol.getManager.Insert(objRol) != true)
                        {
                            throw Rol.getManager.GeneratedException;
                        }
                        SetMode(PageMode.ListMode);
                        cargarGrilla();
                    }
                    else
                    {
                        objRol.IdRol = int.Parse(txtID.Text.Trim());
                        if (Rol.getManager.Update(objRol) != true)
                        {
                            throw Rol.getManager.GeneratedException;
                        }
                        SetMode(PageMode.ViewMode);
                    }
                }
            }
            catch (Exception exc)
            {
                _lblError.Text = "error: No se pudo realizar la operación";
                Functions.LogError(exc);
                SetMode(PageMode.NewMode);
            }
        }

        private FuncionesRol getPermisos()
        {
            FuncionesRol objPermisos = new FuncionesRol();

            try
            {
                bool addNode = false;

                foreach (TreeNode objNode in trvAllFunctions.Nodes)
                {
                    if (objNode.ChildNodes.Count > 0)
                    {
                        addNode = getChildFunctions(objNode, objPermisos);
                    }
                    else
                    {
                        if (objNode.Checked)
                        {
                            FuncionTecnopez.getManager.ClearFilters();
                            FuncionTecnopez.getManager.AddFilter("idFuncionTecnopez", GenericManager<FuncionTecnopez>.filterOperator.Equals, int.Parse(objNode.Value));
                            objPermisos.add(new FuncionRol(FuncionTecnopez.getManager.GetOne()));
                        }
                    }
                    if (addNode)
                    {
                        FuncionTecnopez.getManager.ClearFilters();
                        FuncionTecnopez.getManager.AddFilter("idFuncionTecnopez", GenericManager<FuncionTecnopez>.filterOperator.Equals, int.Parse(objNode.Value));
                        objPermisos.add(new FuncionRol(FuncionTecnopez.getManager.GetOne()));
                    }
                    addNode = false;
                }
            }
            catch (Exception ex)
            {
                _lblError.Text = ex.Message;
            }
            return objPermisos;
        }
        private bool getChildFunctions(TreeNode objNode, FuncionesRol objPermisos)
        {
            bool result = false;
            bool addNode = false;
            foreach (TreeNode objChildNode in objNode.ChildNodes)
            {
                if (objChildNode.ChildNodes.Count > 0)
                {
                    addNode = getChildFunctions(objChildNode, objPermisos);
                }
                else
                {
                    if (objChildNode.Checked)
                    {
                        FuncionTecnopez.getManager.ClearFilters();
                        FuncionTecnopez.getManager.AddFilter("idFuncionTecnopez", GenericManager<FuncionTecnopez>.filterOperator.Equals, int.Parse(objChildNode.Value));
                        objPermisos.add(new FuncionRol(FuncionTecnopez.getManager.GetOne()));
                        result = true;
                    }
                }
                if (addNode)
                {
                    FuncionTecnopez.getManager.ClearFilters();
                    FuncionTecnopez.getManager.AddFilter("idFuncionTecnopez", GenericManager<FuncionTecnopez>.filterOperator.Equals, int.Parse(objChildNode.Value));
                    objPermisos.add(new FuncionRol(FuncionTecnopez.getManager.GetOne()));
                    result = true;
                }
                addNode = false;
            }
            return result;
        }

        private bool validar(Rol objeto)
        {
            ValidationResults v = Validation.Validate<Rol>(objeto);
            if (!v.IsValid)
            {
                _lblError.Text = "Error en el formulario: Por favor verifique los campos ingresados.";
            }
            return v.IsValid;
        }

        private PageMode getMode()
        {
            //if (ViewState["PageMode"] == null)
            //    return PageMode.ModeNotFound;
            return (PageMode)ViewState["PageMode"];
        }

        protected void cmdCancelar_Click(object sender, EventArgs e)
        {
            SetMode(PageMode.ListMode);
        }
        protected void cmdNuevo_Click(object sender, EventArgs e)
        {
            this.txtID.Text = "";
            this.txtNombre.Text = "";
            this.txtDescripcion.Text = "";
            FuncionTecnopez.getManager.ClearFilters();
            FuncionTecnopez.getManager.ClearOrders();
            FuncionTecnopez.getManager.AddOrder("Nombre", GenericManager<FuncionTecnopez>.Order.orderDirection.ASC);
            fillTreeViewer(FuncionTecnopez.getManager.GetFilter());
            SetMode(PageMode.NewMode);
        }

        private void fillTreeViewer(List<FuncionTecnopez> objList)
        {
            try
            {
                List<FuncionTecnopez> objPadres = objList.FindAll(EsPadre);
                trvAllFunctions.Nodes.Clear();

                TreeNode objNode;

                foreach (FuncionTecnopez objAux in objPadres)
                {
                    objNode = new TreeNode();
                    objNode.Text = objAux.Nombre.Trim();

                    objNode.Expanded = false;
                    objNode.Value = objAux.IdFuncionTecnopez.ToString();
                    addChildNodes(objNode, objList);
                    objNode.ShowCheckBox = objNode.ChildNodes.Count == 0;
                    trvAllFunctions.Nodes.Add(objNode);
                }
            }
            catch (Exception ex)
            {
                _lblError.Text = ex.Message;
            }
        }

        private void addChildNodes(TreeNode objNode, List<FuncionTecnopez> objAll)
        {
            List<FuncionTecnopez> objHijos = GetHijos(objAll, int.Parse(objNode.Value));
            TreeNode objChildNode;
            foreach (FuncionTecnopez objAux in objHijos)
            {
                objChildNode = new TreeNode();
                objChildNode.Text = objAux.Nombre.Trim();
                objChildNode.Expanded = false;
                objChildNode.Value = objAux.IdFuncionTecnopez.ToString();
                addChildNodes(objChildNode, objAll);
                objNode.ChildNodes.Add(objChildNode);
                objChildNode.ShowCheckBox = objChildNode.ChildNodes.Count == 0;
            }
        }

        private static bool EsPadre(FuncionTecnopez objFuncion)
        {
            if (objFuncion.FuncionPadre == null)
                return true;
            else
                return false;
        }

        private List<FuncionTecnopez> GetHijos(List<FuncionTecnopez> objLista, int idFuncion)
        {
            List<FuncionTecnopez> lista = new List<FuncionTecnopez>();

            for (int i = 0; i < objLista.Count; i++)
            {
                if (objLista[i].FuncionPadre != null && objLista[i].FuncionPadre.IdFuncionTecnopez == idFuncion)
                {
                    lista.Add(objLista[i]);
                }
            }
            return lista;
        }
    }
}